6.3.4. Silme İşlemi

Silme işlemi için önce arama yapılmalıdır; silinecek düğümden bir öncesi belirlenir ve silinmek istenen düğümün bağlantısı koparılarak aradan çıkarılır. Tek yönlü bağlantılı listede geriye doğru hareket yapılamadığı için bir önceki düğümün adresini öğrenmek mümkün olmaz. Bu nedenle burada verilen silme işleminde arama da vardır. Aşağıda silme işlemi algoritması kaba-kodu ve Fonksiyon-6.4.'de C dilindeki karşılığı verilmiştir.

Bağlantılı Liste Üzerinde Silme Algoritması Kaba-Kodu
p ilk <- (listenin başını gösteren adres p işaretçisine alınır);
1 while(p NULL){
                    silinmek istenen düğümün ve
                    birönceki düğümün adresini bul;
                  }
if( silinmek istenen listede varsa ){
       if(silinmek istenen ilk düğüm ise) {
2                if( listede bir düğüm varsa)
                   ilk ve son NULL;
               else
                   ilk=ilk->arka;
               }
else {
3           silinmek isteneni aradan çıkart
          (silinenin bağlantılarını kopar ve
            yeni bağlantıları yap)
       }
4     free(silinen bellekte işgal ettiği bellek alanı);
}
else
    silinmek istenen listede yok!

Yukarıdaki kaba-kodda görüldüğü gibi, önce silinen aranmaktadır; silinmesi istenen ve bir önceki düğümün adresleri bulunmakta ve silinmesi istenen aradan çıkarılmaktadır. Dikkat edilirse silinmesi istenen halıhazırda ilk düğüm ise ayrı, aradan bir düğüm ise ayrı kod yürütülmektedir. Düğüm silindikten sonra işgal ettiği bellek alanı serbest bırakılır.

Fonksiyon-6.3. Bağlantılı listede arama ( tek yönlü)

/* Listeden bir düğüm silme */
BLISTE *sil(int silinecek)
{
    BLISTE *p, *bironceki;

    p=ilk;
    bironceki=NULL;

    while(p) { /* silinecek olan aranıyor... */
            if(silinecek==p->bilgi)
            break;
            bironceki=p;
            p=p->arka;
    } /* silinecek listede varsa o ve bir önceki bulundu */

    if(p!=NULL) {
            if(bironceki==NULL) { /* silinecek olan birinci düğüm! */
            if(ilk==son) { /* listede yalnızca 1 düğüm varsa */
                     ilk=NULL;
                     son=NULL;
                    }
            else
                ilk=ilk->arka;
    }
else { /* silinecek olan aradan bir düğüm */
         bironceki->arka=p->arka;

         if(bironceki->arka==NULL)
            son=bironceki; /*silinen son düğüm */
}

   free(p); /* alan serbest bırakılıyor */
   return p; /* NULL'dan farklı adres gönderiliyor */
}

else
    return NULL; /* silinmek istenen listede yok */

}